package com.gxc.dynamic;

import java.util.Arrays;

/**
 * 乘积最大子数组

 * 给你一个整数数组 nums ，请你找出数组中乘积最大的非空连续 子数组（该子数组中至少包含一个数字），并返回该子数组所对应的乘积。
 *
 * 测试用例的答案是一个 32-位 整数。
 */
public class MaxProduct {

    public static void main(String[] args) {
        System.out.println(maxProduct3(new int[]{-4,-3,-2}));
    }

    public int maxProduct(int[] nums) {
        int max = nums[0];
        int[] maxDp = new int[nums.length];
        maxDp[0] = nums[0];
        int[] minDp = new int[nums.length];
        minDp[0] = nums[0];
        for (int i = 1; i < nums.length; i++) {
            maxDp[i] = Math.max(nums[i], Math.max(maxDp[i-1] * nums[i], minDp[i-1] * nums[i]));
            minDp[i] = Math.min(nums[i], Math.min(maxDp[i-1] * nums[i], minDp[i-1] * nums[i]));
            max = Math.max(max, maxDp[i]);
        }

        return max;
    }

    public static int maxProduct3(int[] nums) {
        int max = nums[0];
        int maxDp = nums[0];
        int minDp = nums[0];
        for (int i = 1; i < nums.length; i++) {
            int lastMax = maxDp, lastMin = minDp;
            maxDp = Math.max(nums[i], Math.max(lastMax * nums[i], lastMin * nums[i]));
            minDp = Math.min(nums[i], Math.min(lastMax * nums[i], lastMin * nums[i]));
            max = Math.max(max, maxDp);
        }

        return max;
    }

    public int maxProduct2(int[] nums) {
        long maxF = nums[0], minF = nums[0];
        int ans = nums[0];
        int length = nums.length;
        for (int i = 1; i < length; ++i) {
            long mx = maxF, mn = minF;
            maxF = Math.max(mx * nums[i], Math.max(nums[i], mn * nums[i]));
            minF = Math.min(mn * nums[i], Math.min(nums[i], mx * nums[i]));
            if(minF<-1<<31){
                minF=nums[i];
            }
            ans = Math.max((int)maxF, ans);
        }
        return ans;
    }

}
